#ifndef JNTPSOCKET_H
#define JNTPSOCKET_H

#include <QTENetwork/qtenetworkglobal.h>
#include <QObject>

class QHostAddress;

namespace QTE
{

class JNTPSocketPrivate;

class QTENETWORK_EXPORT JNTPSocket : public QObject
{
	Q_OBJECT

public:
	explicit JNTPSocket(QObject *parent = nullptr); // default "time.windows.com:123"
	explicit JNTPSocket(const QHostAddress &address, quint16 port = 123, QObject *parent = nullptr);

	// domain name or ip
	explicit JNTPSocket(const QString &hostName, quint16 port = 123, QObject *parent = nullptr);
	~JNTPSocket();

public:
	struct Format
	{
		qint8 LI      = 0;  //预告
		qint8 VN      = 3;  //版本号
		qint8 MODE    = 3;  //客户端版本
		qint8 STRATUM = 0;  //本地时钟层次水平
		qint8 POLL    = 4;  //测试间隔
		qint8 PREC    = -6; //本地时钟精度

		inline Format() {}
	};

public Q_SLOTS:
	bool request(const JNTPSocket::Format& = Format());
	bool setServer(const QHostAddress &address, quint16 port = 123);
	bool setServer(const QString &hostName, quint16 port = 123);

	void start(const JNTPSocket::Format& = Format(), int msecs = 1000);
	void stop();

public:
	QHostAddress serverAddress() const;
	quint16 serverPort() const;
	bool isStart() const;

Q_SIGNALS:
	void received(const QDateTime &dateTime);

public:
	QDateTime waitForReceived(int msecs = 30000);
	QString errorString() const;

private:
	JNTPSocketPrivate *d_ptr;
};

} //namespace QTE

Q_DECLARE_METATYPE(QTE::JNTPSocket::Format)

/*
NTP Server (port: 123):

	# 中科院
	ntp.ntsc.ac.cn

	# 腾讯云
	ntp.tencent.com
	ntp1.tencent.com
	ntp2.tencent.com
	ntp3.tencent.com
	ntp4.tencent.com
	ntp5.tencent.com

	# 阿里云
	ntp.aliyun.com

	# 中国教育网
	time.edu.cn
	s2c.time.edu.cn
	s2f.time.edu.cn
	s2k.time.edu.cn

	# 清华大学
	s1b.time.edu.cn
	s1e.time.edu.cn
	s2a.time.edu.cn
	s2b.time.edu.cn

	# 北京大学
	s2m.time.edu.cn
	s1c.time.edu.cn

	# 北京邮电大学
	s1a.time.edu.cn
	s2c.time.edu.cn

	# 上海交通大学
	ntp.sjtu.edu.cn

	# 东南大学
	s1d.time.edu.cn

	# 四川大学
	s2h.time.edu.cn

	# 大连理工大学
	s2j.time.edu.cn

	# 西南地区网络中心
	s2d.time.edu.cn

	# 西北地区网络中心
	s2e.time.edu.cn

	# 东北地区网络中心
	s2f.time.edu.cn

	# 华东南地区网络中心
	s2g.time.edu.cn

	# CERNET桂林主节点
	s2k.time.edu.cn

	# Microsoft Windows Server (default)
	time.windows.com
*/


#endif //JNTPSOCKET_H
